package com.itheima.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.reggie.common.R;
import com.itheima.reggie.dto.DishDto;
import com.itheima.reggie.dto.SetmealDto;
import com.itheima.reggie.entity.Category;
import com.itheima.reggie.entity.Dish;
import com.itheima.reggie.entity.Setmeal;
import com.itheima.reggie.entity.SetmealDish;
import com.itheima.reggie.service.CategoryService;
import com.itheima.reggie.service.DishService;
import com.itheima.reggie.service.SetmealDishService;
import com.itheima.reggie.service.SetmealService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 套餐管理
 */

@RestController
@RequestMapping("/setmeal")
@Slf4j
public class SetmealController {
    @Resource
    private SetmealService setmealService;
    @Autowired
    private CategoryService categoryService;

    @Autowired
    private SetmealDishService setmealDishService;

    @Autowired
    private DishService dishService;

    /**
     * 新增套餐
     * @param setmealDto
     * @return
     */
    @PostMapping
    public R<String> save(@RequestBody SetmealDto setmealDto)
    {
       setmealService.saveWithDish(setmealDto);
       return R.success("新增套餐成功");
    }

    /**
     * 根据id查询套餐信息和对应的菜品信息，先回显数据才能修改
     * @param id
     * @return
     */
    @GetMapping("/{id}")
    public R<Object> get(@PathVariable Long id)
    {

        SetmealDto  setmealDto = setmealService.getByIdWithDish(id);
        return R.success(setmealDto);
    }

    @PutMapping
    public R<String> update(@RequestBody SetmealDto setmealDto)
    {
        setmealService.updateWithDish(setmealDto);
        return R.success("修改套餐成功");
    }

    /**
     * 单个/批量修改售卖状态
     * @param status
     * @param ids
     * @return
     */
    @PostMapping("/status/{status}")
    public R<String> status(@PathVariable Integer status,
                            @RequestParam List<Long> ids)
    {
        setmealService.updateSetmealStatusById(status,ids);
        return R.success("售卖状态修改成功");
    }
    /**
     * 删除套餐
     * 查询套餐状态，确定是否在售卖状态，如果是则不能删除，先要把它变成停售状态才能删除
     * @param ids
     * @return
     */
    @DeleteMapping
    public R<String> delete(@RequestParam List<Long> ids)
    {
        setmealService.removeWithDish(ids);
        return R.success("删除套餐成功");
    }

    /**
     * 套餐信息分页查询
     * 多表联查
     * 将分类id转成分类名称展示到页面
     * @param name
     * @param page
     * @param pageSize
     * @return
     */
    @GetMapping("/page")
    public R<Page> page(@RequestParam(defaultValue = "") String name,
                        @RequestParam Integer page,
                        @RequestParam Integer pageSize)
    {
        //1、构造分页构造器pages
        Page<Setmeal> pages = new Page<>(page, pageSize);
        //2、构造条件构造器wrapper
        LambdaQueryWrapper<Setmeal> wrapper = new LambdaQueryWrapper<>();
        //3、添加过滤条件wrapper.like，如果传入的name参数不为空则按数据库的name字段查询
        wrapper.like(name != null, Setmeal::getName,name);
        //4、添加排序条件，按照修改时间优先
        wrapper.orderByDesc(Setmeal::getUpdateTime);
        //5、执行查询
        setmealService.page(pages, wrapper);

        //对象拷贝，忽略分页的查询数据即 Page的"records"数据不拷贝，因为需要另外处理
        Page<SetmealDto> dishDtoPage = new Page<>();
        BeanUtils.copyProperties(pages,dishDtoPage,"records" );
        //获取分页的所有数据
        List<Setmeal> records = pages.getRecords();

        //遍历
        List<SetmealDto> list =records.stream().map((record) -> {

            //创建DishDto对象
            SetmealDto setmealDto = new SetmealDto();
            //对象拷贝
            BeanUtils.copyProperties(record,setmealDto);
            //获取分类id
            Long categoryId = record.getCategoryId();
            //根据id查询菜品分类对象
            Category category = categoryService.getById(categoryId);
            if (category != null)
            {
                //获取菜品名称
                String categoryName = category.getName();
                //将分类id转成分类名称
                setmealDto.setCategoryName(categoryName);
            }
            return setmealDto;

        }).collect(Collectors.toList());

        dishDtoPage.setRecords(list);

        //6、返回状态码以及信息
        return R.success(dishDtoPage);
    }

    /**
     * 移动端需要显示的套餐数据
     * @param setmeal
     * @return
     */
    @GetMapping("/list")
    public R<List<Setmeal>> list(Setmeal setmeal)
    {
        LambdaQueryWrapper<Setmeal> wrapper = new LambdaQueryWrapper<>();
        //商务/儿童套餐
        wrapper.eq(Setmeal::getCategoryId,setmeal.getCategoryId());
        //是否为售卖状态 状态 0:停用 1:启用
        wrapper.eq(Setmeal::getStatus,setmeal.getStatus());
        wrapper.orderByDesc(Setmeal::getUpdateTime);
        List<Setmeal> list = setmealService.list(wrapper);
        return R.success(list);

    }

    /**
     * 移动端点击套餐图片查看套餐具体内容
     * 一个套餐可以有多个菜品
     * 这里返回的是dto 对象，因为前端需要copies份数属性，实体类没有
     * @param SetmealId
     * @return
     */
    @GetMapping("/dish/{id}")
    public R<List<DishDto>> dish(@PathVariable("id") Long SetmealId){
        LambdaQueryWrapper<SetmealDish> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(SetmealDish::getSetmealId,SetmealId);
        //获取套餐里面的所有菜品  这个就是SetmealDish表里面的数据
        List<SetmealDish> list = setmealDishService.list(queryWrapper);

        List<DishDto> dishDtos = list.stream().map((setmealDish) -> {
            DishDto dishDto = new DishDto();
            //其实这个BeanUtils的拷贝是浅拷贝
            BeanUtils.copyProperties(setmealDish, dishDto);
            //这里是为了把套餐中的菜品的基本信息填充到dto中，比如菜品描述，菜品图片等菜品的基本信息
            Long dishId = setmealDish.getDishId();
            Dish dish = dishService.getById(dishId);
            BeanUtils.copyProperties(dish, dishDto);

            return dishDto;
        }).collect(Collectors.toList());

        return R.success(dishDtos);
    }


}
